@echo off
REM 编译和运行Java GPU示例的批处理脚本 - JCuda 12.6.0版本

REM SETLOCAL

REM 设置颜色
color 0A

REM 欢迎信息
echo =======================================================
echo          Java GPU计算示例 - JCuda 12.6.0版本        
echo =======================================================

REM 检查是否存在vectorAdd.cu文件
if not exist vectorAdd.cu (
    echo 警告: 未找到vectorAdd.cu文件
    echo 正在创建vectorAdd.cu文件...
    echo // CUDA核函数 - 向量加法实现 > vectorAdd.cu
    echo extern "C" >> vectorAdd.cu
    echo __global__ void vectorAdd(const float *a, const float *b, float *c, int n) >> vectorAdd.cu
    echo { >> vectorAdd.cu
    echo     int i = blockIdx.x * blockDim.x + threadIdx.x; >> vectorAdd.cu
    echo     if (i < n) { >> vectorAdd.cu
    echo         c[i] = a[i] + b[i]; >> vectorAdd.cu
    echo     } >> vectorAdd.cu
    echo } >> vectorAdd.cu
    echo vectorAdd.cu文件已创建
    echo.
)

REM 检查nvcc编译器是否可用
where nvcc >nul 2>nul
if %ERRORLEVEL% neq 0 (
    echo 警告: 未找到nvcc编译器
    echo 请确保已安装CUDA Toolkit 12.6并配置了环境变量
    echo 程序将以CPU模式运行
    echo.
    goto build_project
) else (
    echo 已找到nvcc编译器
)

REM 检查Visual Studio C++编译器(cl.exe)是否可用
where cl.exe >nul 2>nul
if %ERRORLEVEL% neq 0 (
    echo 警告: 未找到Visual Studio C++编译器(cl.exe)
    echo 这是编译CUDA代码所必需的组件
    echo 请参考CUDA_COMPILER_SETUP_GUIDE.md文件获取详细的安装指南
    echo 程序将以CPU模式运行
    echo.
    goto build_project
) else (
    echo 已找到Visual Studio C++编译器
)

REM 编译CUDA核函数
echo 正在编译CUDA核函数为PTX文件...
nvcc -ptx vectorAdd.cu -o vectorAdd.ptx

if %ERRORLEVEL% neq 0 (
    echo 警告: PTX文件编译失败
    echo 请检查CUDA Toolkit和Visual Studio的安装和配置
    echo 详细信息请参考CUDA_COMPILER_SETUP_GUIDE.md
    echo 程序将以CPU模式运行
    echo.
) else (
    echo PTX文件编译成功
    echo.
)

:build_project
REM 构建Java项目
echo 正在构建Java项目...
mvn clean package

if %ERRORLEVEL% neq 0 (
    echo 错误: 项目构建失败，请检查错误信息
    color 0C
    pause
    exit /b %ERRORLEVEL%
)

echo.
echo 项目构建成功！
echo.
echo 请选择运行模式:
echo 1. GPU模式 (需要CUDA环境)
echo 2. CPU模式 (不需要GPU，适合所有环境)
echo.

set /p choice="请输入选择 (1 或 2): "

if "%choice%" equ "1" (
    echo 正在运行JCuda 12.6.0 GPU计算示例...
    echo =======================================================
    echo.
    
    REM 运行主程序
    java -jar target/javagpu-example-1.0-SNAPSHOT-jar-with-dependencies.jar
    
) else if "%choice%" equ "2" (
    echo 正在运行CPU-only向量运算示例...
    echo =======================================================
    echo.
    
    REM 运行CPU-only示例
    java -cp target/javagpu-example-1.0-SNAPSHOT-jar-with-dependencies.jar com.example.gpu.CPUOnlyExample
    
) else (
    echo 无效选择，默认以CPU模式运行...
    echo =======================================================
    echo.
    
    REM 默认运行CPU-only示例
    java -cp target/javagpu-example-1.0-SNAPSHOT-jar-with-dependencies.jar com.example.gpu.CPUOnlyExample
)

REM 检查程序执行结果
if %ERRORLEVEL% neq 0 (
    echo.
echo 错误: 程序执行失败
    color 0C
) else (
    echo.
echo 程序执行完成
)

echo.
echo =======================================================
echo 提示: 要启用完整的GPU计算，请按照CUDA_COMPILER_SETUP_GUIDE.md中的说明设置环境
color 07
pause

ENDLOCAL